package com.linwen.javase.juc;

import lombok.val;

/**
 * @ClassName _01Thread
 * @Description
 * @Author lin
 * @Date 2022/4/18 下午11:16
 * @Version V1.0
 *
 * 线程分为用户线程和守护线程
 * 用户线程不结束，jvm不结束
 * 守护线程可在后台执行，main结束，即结束
 * 所谓守护线程，是指在程序运行的时候在后台提供一种通用服务的线程，比如垃圾回收线程就是一个很称职的守护者，
 * 并且这种线程并不属于程序中不可或缺的部分。因 此，当所有的非守护线程结束时，程序也就终止了，同时会杀死进程中的所有守护线程。
 * 反过来说，只要任何非守护线程还在运行，程序就不会终止。
 *
 * 守护线程和用户线程的唯一不同之处就在于虚拟机的离开：如果用户线程已经全部退出运行了，只剩下守护线程存在了，虚拟机也就退出了。
 * 因为没有了被守护者，守护线程也就没有工作可做了，也就没有继续运行程序的必要了。
 *
 */
public class _01Thread {
    public static void main(String[] args) {
        //守护线程 睡眠5s
        Thread daemonThread = new Thread(()->{
            try {
                Thread.sleep(5000);
                System.out.println("id:" + Thread.currentThread().getId() + "-守护进程执行完了");
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        //用户线程 睡眠10s 确保在守护线程后面结束
        Thread userThread = new Thread(()->{
            try {
                Thread.sleep(10000);
                System.out.println("id:" + Thread.currentThread().getId() + "-非守护进程执行完了");
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        //设置为守护进程
        daemonThread.setDaemon(true);
        daemonThread.start();
        userThread.start();
        //主线程执行完 不做任何睡眠操作
        System.out.println("id:" + Thread.currentThread().getId() + "-主线程结束了");

    }

}
